package guet.imagan.progbuilder;

import guet.imagan.util.ListUtil;

import java.util.List;

public class InterpreteBuilder extends Builder {
	public InterpreteBuilder(Interpreter interpreter) {
		super(interpreter);
	}

	/**
	 * 根据文件名(包含完整路径），创建可执行文件对象,这对于可执行文件是有效的
	 *
	 * @param fileName 文件名字符串
	 * @return ExecuteFile对象
	 */
	@Override
	public ExecuteFile getExecuteFile(String fileName) {
		throw new UnsupportedOperationException();
	}

	/**
	 * 在新的窗口以阻塞的方式运行项目，即：只要该窗口没有关闭，该方法就不会返回。
	 * 说明：该方法将根据需要决定是否构建项目，生成目标文件，然后执行程序。
	 *
	 * @param project 待运行的项目
	 * @param args    启动运行时，传入的命令行参数，这个参数将作为main函数或方法的实参传入。
	 * @throws CompilerException    当项目编译失败时
	 * @throws InterpreterException 当项目解释失败时
	 * @throws ExecuteFileException 当运行程序失败时
	 */
	@Override
	public void run(Project project, String... args) throws CompilerException, InterpreterException, ExecuteFileException, Project.ProjectException {
		List<String>errs = interpreter.checkSyntaxErr(project);
		if(errs!=null){
			String errMsg=ListUtil.list2Str(errs);
			throw new InterpreterException(errMsg);
		}
		interpreter.executeWithWindow(project,args);
	}

	/**
	 * 在后台以非阻塞的方式运行项目，这种方式无法看到运行程序的窗口。这种方式适合命令行程序的测试。
	 *
	 * @param project   待运行的项目
	 * @param inputFile
	 * @param args      启动运行时，传入的命令行参数，这个参数将作为main函数或方法的实参传入。
	 * @return 程序的控制台输出
	 * @throws CompilerException    当项目编译失败时
	 * @throws InterpreterException 当项目解释失败时
	 * @throws ExecuteFileException 当运行程序失败时
	 */
	@Override
	public TextFile run(Project project, TextFile inputFile, String... args) throws CompilerException, InterpreterException, ExecuteFileException, Project.ProjectException {
		return interpreter.executeWithoutWindow(project,inputFile,args);
	}
}
